package com.zut.view;

import com.zut.entity.Course;
import com.zut.entity.Student;
import com.zut.service.CourseService;
import com.zut.service.ScoreService;
import com.zut.service.StudentService;
import com.zut.service.impl.CourseServiceImpl;
import com.zut.service.impl.ScoreServiceImpl;
import com.zut.service.impl.StudentServiceImpl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class ScoreView {

    //存储当前登录的教师id
    private String tid;

    //存储该教师教授的课程信息
    private Course course;

    //课程业务对象
    private CourseService cs = new CourseServiceImpl();

    //学生业务对象
    private StudentService sts = new StudentServiceImpl();

    //扫描器
    private Scanner sc = new Scanner(System.in);


    //成绩的业务对象
    private ScoreService scs = new ScoreServiceImpl();

    //用于存储教授的所有学生的id编号
    private List<String> stuIds;

    public void manageCourseScorePage(String id) {

        tid = id;

        //调用当前老师教授课程的查询方法
        course = cs.findCourseByTid(tid);

        while (true) {
            System.out.println("*****************成绩管理界面*****************");
            System.out.println("您教授的课程为:" + course.getCname());
            System.out.println("请选择功能:1、添加学生课程成绩 2、查询教授课程的学生成绩 3、修改学生课程成绩 4、删除学生课程成绩 0、退出系统");

            //接收输入的选项
            String num = sc.nextLine();

            switch (num) {
                case "1":
                    addScorePage();
                    break;
                case "2":
                    allScorePage();
                    break;
                case "3":
                    updateGradePage();
                    break;
                case "4":
                    deleteScorePage();
                    break;
                case "0":
                    return;

                default:
                    System.out.println("功能暂未开放，请重新选择");
            }
        }
    }

    /**
     * 删除成绩
     */
    private void deleteScorePage() {
        allScorePage();

        while (true) {

            System.out.println("请输入需要删除成绩的学生编号:");
            String stuId = sc.nextLine();

            if (stuIds.contains(stuId)) {
                //执行删除业务
                boolean bl = scs.deleteScoreBySidAndCid(stuId, course.getId());
                System.out.println(bl ? "删除成功" : "暂未录入成绩");
                return;
            } else {
                System.out.println("该学生" + course.getCname() + "成绩，您无权限删除");
            }

        }


    }

    /**
     * 修改教授的学生的课程成绩
     */
    private void updateGradePage() {

        //展示可以进行修改的学生信息
        allScorePage();

        while (true) {
            System.out.println("请输入需要进行成绩更改的学生编号:");
            String stuId = sc.nextLine();

            if (stuIds.contains(stuId)) {

                System.out.println("请输入新成绩");
                String newGrade = sc.nextLine();

                //调用修改业务
                boolean bl = scs.updateGrade(stuId, course.getId(), newGrade);

                System.out.println(bl ? "修改成功" : "该学生暂未录入成绩");
                return;
            } else {
                System.out.println("该学员成绩无法修改");
            }


        }


    }

    /**
     * 课程成绩
     */
    private void allScorePage() {

        //调用业务方法
        List<Map<String, Object>> list = scs.findScoresByTidAndCid(tid, course.getId());

        //根据结果进行展示
        stuIds = new ArrayList<>();

        if (list.size() == 0) {

            System.out.println("暂无学生成绩");
            return;
        }

        //有学生成绩，则展示
        for (Map<String, Object> map : list) {
            System.out.println("学生编号:" + map.get("id") + "\t学生姓名:" + map.get("name") + "\t课程名称:" + course.getCname() + "\t成绩:" + map.get("grade"));
            stuIds.add((String) map.get("id"));
        }
    }

    /**
     * 添加成绩
     * 1、查询可以进行成绩添加的学生信息
     * <p>
     * 2、输入学号，进行判断
     * <p>
     * 3、输入成绩进行添加
     */
    private void addScorePage() {

        //查询可以进行成绩添加的学生信息
        List<Student> list = sts.findStudentsByTid(tid, course.getId());

        if (list.size() == 0) {
            System.out.println("暂无学生需要进行成绩添加");
            return;
        }

        //存储查询到的学生编号，方便进行输入学号的判断
        List<String> stuids = new ArrayList<>();
        //展示可以进行添加成绩的学生信息
        for (Student student : list) {
            System.out.println("学生编号:" + student.getId() + "\t学生姓名:" + student.getName());
            stuids.add(student.getId());
        }

        while (true) {
            System.out.println("请输入学号");
            String stuId = sc.nextLine();

            if (stuids.contains(stuId)) {

                System.out.println("请输入学生成绩:");
                String grade = sc.nextLine();

                //添加成绩
                scs.addScore(stuId, course.getId(), grade);

                return;

            } else {
                System.out.println("学号不正确，请重新输入");
            }
        }


    }

    /**
     * 根据学号查询学生成绩
     *
     * @param id
     */
    public void findSocresBySidPage(String id) {

        System.out.println("你的成绩如下:");
        //调用业务方法
        List<Map<String, Object>> list = scs.findScoresBySid(id);

        //展示
        if (list.size() == 0) {
            System.out.println("暂无成绩信息");
            return;
        }

        //有成绩信息，则遍历展示
        for (Map<String, Object> map : list) {
            System.out.println("课程名称:" + map.get("cname") + "\t成绩:" + map.get("grade"));
        }


    }
}


